// 引入env中的url
import config from '@/config'
import CryptoJS from 'crypto-js';
const baseUrl = config.baseUrl;
// 加密解密 密匙
const aesKey = '1234567890abcdef';
// 是否加密
const encryptEnabled = true;

// 加密函数
function encryptAes(data, aesKey) {
  const key = CryptoJS.enc.Utf8.parse(aesKey);
  const srcs = CryptoJS.enc.Utf8.parse(data);
  const encrypted = CryptoJS.AES.encrypt(srcs, key, {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7
  });
  return encrypted.toString(); // 返回Base64格式的字符串
}

// 解密函数
function decryptAes(data, aesKey) {
  const key = CryptoJS.enc.Utf8.parse(aesKey || '1234567890abcdef');
  const decrypted = CryptoJS.AES.decrypt(data, key, {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7
  });
  return CryptoJS.enc.Utf8.stringify(decrypted).toString();
}

module.exports = {
  /**
   * 网络请求方法
   * @param {Object} obj 请求参数
   * @param {string} obj.url 请求地址
   * @param {string} obj.method 请求方法
   * @param {Object} obj.data 请求数据
   * @param {boolean} obj.needToken 是否需要token
   */
  async request(obj) {
    const _url = `${baseUrl}${obj.url}`;
    let headers = {};
    
    // 处理token
    if (obj.needToken) {
      try {
        const res = await uni.getStorage({ key: 'loginData' });
        headers.Authorization = `Bearer ${res.data.zaToken}`;
      } catch (error) {
        console.error('获取token失败:', error);
      }
    }

    // 加密数据
    try {
      obj.data = typeof obj.data === "object" 
        ? encryptAes(JSON.stringify(obj.data), aesKey) 
        : encryptAes(obj.data, aesKey);
    } catch (error) {
      console.error('数据加密失败:', error);
      return Promise.reject('数据加密失败');
    }

    return new Promise((resolve, reject) => {
      // 添加延时确保headers已设置
      setTimeout(() => {
        wx.request({
          url: _url,
          data: obj.data,
          method: obj.method,
          header: headers,
          success: (res) => {
            try {
              let data;
              // 数据解密
              if (res.data instanceof Object || !encryptEnabled) {
                data = res.data;
              } else {
                const dataStr = decryptAes(res.data, aesKey);
                data = JSON.parse(dataStr);
              }
              resolve(data);
            } catch (error) {
              console.error('数据处理失败:', error);
              reject('数据处理失败');
            }
          },
          fail: (error) => {
            console.error('请求失败:', error);
            reject("接口请求错误，请检查");
          }
        });
      }, 1000);
    });
  },

  /**
   * 随机生成16位的AES密钥
   * @returns {string}
   */
  getAESKey() {
    const chars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
    let res = "";
    for (let i = 0; i < 16; i++) {
      const id = Math.floor(Math.random() * chars.length);
      res += chars[id];
    }
    return res;
  },

  // 暴露加密解密方法
  encryptAes,
  decryptAes
};